package com.splic.product.service.impl;

import com.splic.common.core.DeviceContext;
import com.splic.common.utils.DateUtils;
import com.splic.product.domain.Product;
import com.splic.product.domain.ProductUser;
import com.splic.product.domain.User;
import com.splic.product.mapper.ProductUserMapper;
import com.splic.product.mapper.UserActiveMapper;
import com.splic.product.service.ProductService;
import com.splic.product.service.ProductUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 产品用户关系Service业务层处理
 * 
 * @author singe
 * @date 2022-01-04
 */
@Service
public class ProductUserServiceImpl implements ProductUserService
{
    @Autowired
    private ProductUserMapper productUserMapper;
    @Autowired
    private UserActiveMapper userActiveMapper;
    @Autowired
    private ProductService productServiceImpl;

    /**
     * 查询产品用户关系
     * 
     * @param id 产品用户关系主键
     * @return 产品用户关系
     */
    @Override
    public ProductUser selectProductUserById(Long id)
    {
        return productUserMapper.selectProductUserById(id);
    }

    /**
     * 查询产品用户关系列表
     * 
     * @param productUser 产品用户关系
     * @return 产品用户关系
     */
    @Override
    public List<ProductUser> selectPageList(ProductUser productUser)
    {
        return productUserMapper.selectProductUserList(productUser);
    }

    /**
     * 查询产品用户关系列表
     *
     * @param productUser 产品用户关系
     * @return 产品用户关系
     */
    @Override
    public List<ProductUser> selectProductUserList(ProductUser productUser)
    {
        return productUserMapper.selectProductUserList(productUser);
    }

    /**
     * 新增产品用户关系
     * 
     * @param productUser 产品用户关系
     * @return 结果
     */
    @Override
    public int insert(ProductUser productUser)
    {
        productUser.setCreateTime(DateUtils.getNowDate());
        return productUserMapper.insert(productUser);
    }

    /**
     * 修改产品用户关系
     * 
     * @param productUser 产品用户关系
     * @return 结果
     */
    @Override
    public int update(ProductUser productUser)
    {
        productUser.setUpdateTime(DateUtils.getNowDate());
        return productUserMapper.update(productUser);
    }


    /**
     * 删除产品用户关系信息
     * 
     * @param id 产品用户关系主键
     * @return 结果
     */
    @Override
    public int deleteById(Long id)
    {
        return productUserMapper.deleteById(id);
    }
    /**
     * 修改产品用户关系
     *
     * @param productUser 产品用户关系信息
     * @return 结果
     */
    @Override
    @Transactional
    public int saveOrUpdate(ProductUser productUser)
    {
        if(productUser.getId() != null){
            productUser.setUpdateTime(new Date());
            return productUserMapper.update(productUser);
        }else{
            productUser.setCreateTime(new Date());
            return productUserMapper.insert(productUser);
        }
    }

    @Override
    public void selectUserProductNumber(List<User> list) {
        List<Map<String, Long>> productUsers = productUserMapper.selectUserProductNumber(list);
        Map<Long, Long> userProductMap = new HashMap<>();
        for (Map<String, Long> map : productUsers) {
            userProductMap.put(map.get("id"), map.get("productNumber"));
        }
// TODO: 2023/3/16 查询缓慢
        List<Map<String, Object>> maps = userActiveMapper.selectActiveByUser(list);
        Map<Long, Map<String, Object>> userActiveMap = new HashMap<>();
        for (Map<String, Object> map : maps) {
            userActiveMap.put((Long) map.get("userId"), map);
        }
        for (User user : list) {
            if (userProductMap.containsKey(user.getId())) {
                user.setProductNum(userProductMap.get(user.getId()).intValue());
            }
            if (userActiveMap.containsKey(user.getId())) {
                user.setPhoneBrand((String) (userActiveMap.get(user.getId()).get("phoneBrand")));
                user.setPhoneModel((String) userActiveMap.get(user.getId()).get("phoneModel"));
            }
        }
    }

    @Override
    @Async
    public void maybeSave(User user) {
        Product product = productServiceImpl.getByPackageKey(DeviceContext.getProductPackageKey());
        if (product != null) {
            ProductUser productUser = new ProductUser();
            productUser.setUserId(user.getId());
            productUser.setProductId(product.getId());
            List<ProductUser> list = this.selectPageList(productUser);
            if (list == null || list.size() == 0) {
                this.insert(productUser);
            }
        }
    }
}
